#ifndef __GENERATOR_H
#define __GENERATOR_H 1

#include <common.h>
#include <ast.h>
#include <type.h>


class Generator {
    int _loop = 0;
public:
    bool inLoop() const { return _loop > 0; }


    virtual void gen(BlockStat* ptr) = 0;
    virtual void gen(ReturnStat* ptr) = 0;
    virtual void gen(IfStat* ptr) = 0;

    virtual void gen(UnaryOpStat* ptr) = 0;
    virtual void gen(BinaryOpStat* ptr) = 0;
    virtual void gen(TernaryOpStat* ptr) = 0;

    virtual void gen(NameStat* ptr) = 0;
    virtual void gen(LiteralIntegerStat* ptr) = 0;

    virtual void gen(ParamStat *ptr) = 0;
    virtual void gen(FunctionStat* ptr) = 0;

    virtual void gen(ForStat* ptr) = 0;

    virtual void gen(VariableDefineStat* ptr) = 0;
    virtual void gen(VariableStat *ptr) = 0;

    virtual void gen(StructStat *ptr) = 0;
    virtual void gen(VarStat *ptr) = 0;

    virtual void gen(GotoStat *ptr) = 0;
    virtual void gen(DoWhileStat *ptr) = 0;
    virtual void gen(WhileStat *ptr) = 0;
    virtual void gen(ContinueStat *ptr) = 0;
    virtual void gen(BreakStat *ptr) = 0;

    virtual void gen(LabelStat *ptr) = 0;

    virtual void genType(Type ptr) = 0;
};


#endif // __GENERATOR_H
